package com.example.blog_system.mapper;

import com.example.blog_system.entity.ArticleInfo;
import com.example.blog_system.entity.CommentInfo;
import com.example.blog_system.entity.vo.ArticleInfoVO;
import com.example.blog_system.entity.vo.CommentInfoVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.LinkedList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description: 文章映射层 提供操作数据库的接口方法
 */
@Mapper
public interface ArticleMapper {

    /**
     * 显示指定博文id 的所有博文
     *
     * @param id 博文id
     * @return
     */
    List<ArticleInfoVO> showArticleInfo(@Param("id") Integer id,@Param("state") Integer state);

    /**
     * 查询当前登录用户指定已发布的文章
     *
     * @param uid 用户id
     * @param id  博文id
     * @return
     */
    ArticleInfoVO showMyArticle(@Param("uid") Integer uid, @Param("id") Integer id);

    /**
     * 阅读量+1
     *
     * @param id 用户id
     * @return
     */

    int addRCount(@Param("id") Integer id);

    /**
     * 删除 当前用户的 某篇博文  逻辑删除 将状态码改为0
     *
     * @param uid 用户id
     * @param id  博文id
     * @return
     */

    Integer del(@Param("uid") Integer uid, @Param("id") Integer id,@Param("state") Integer state);

    /**
     * 给当前用户添加博文  (state 表示文章状态 1表示发布状态 2表示暂存状态)
     *
     * @param text 博文的所有信息
     * @return
     */


    int add(ArticleInfo text);

    /**
     * 获取当前用户的某篇博文
     *
     * @param uid 用户id
     * @param id  博文id
     * @return
     */
    ArticleInfoVO getBlogToModify(@Param("uid") Integer uid, @Param("id") Integer id);

    /**
     * 修改当前用户的 某篇博文
     *
     * @param uid           用户id
     * @param articleInfoVO 修改的博文 存在博文id
     * @return
     */
    Integer modify(@Param("uid") Integer uid, @Param("articleInfoVO") ArticleInfoVO articleInfoVO);

    /**
     * 分页 博文 根据偏移量和限制条数
     *
     * @param offset
     * @param psize
     * @return
     */

    List<ArticleInfoVO> showBlogsByPage(@Param("offset") Integer offset, @Param("psize") Integer psize, @Param("sort")
    String sort, @Param("sortvalue") String sortvalue);

    /**
     * 获得所有博文数量
     *
     * @return
     */

    Integer getBlogCount();

    /**
     * 根据某篇博文id获取博文信息
     *
     * @param id
     * @return
     */

    ArticleInfoVO getContent(@Param("id") Integer id);

    /**
     * 根据 用户id 和博文id 获取点赞记录
     *
     * @param uid
     * @param id
     * @return
     */

    Integer linkInfo(@Param("uid") Integer uid, @Param("id") Integer id);

    /**
     * 删除点赞记录
     *
     * @param uid 用户id
     * @param id  博文id
     * @return
     */

    Integer unlike(@Param("uid") Integer uid, @Param("id") Integer id);

    /**
     * 添加点赞记录
     *
     * @param uid 用户id
     * @param id  博文id
     * @return
     */

    Integer like(@Param("uid") Integer uid, @Param("id") Integer id);

    /**
     * 文章获赞记录+1
     *
     * @param id 文章id
     * @return
     */
    Integer addLike(@Param("id") Integer id);

    Integer delLike(@Param("id") Integer id,@Param("num") Integer num);

    Integer save(@Param("id") Integer id, @Param("tmpArticle") ArticleInfo tmpArticle);

    List<ArticleInfoVO> searchArticle(@Param("option") String option,@Param("title") String title);

    Integer delByAdmin(@Param("id") Integer id, @Param("state") Integer state);

    Integer getUidById(@Param("id") Integer id);

    Integer delLikeInfo(@Param("id") Integer id);


    List<CommentInfoVO> showComments(@Param("id") Integer id);

    Integer addComment(@Param("commentInfo") CommentInfo commentInfo);

    Integer delComment(@Param("bid") Integer bid,@Param("cid") Integer cid);

    void delCommentCount(@Param("cid") Integer cid);

    void addCommentCount(@Param("bid") Integer bid);

    Integer getUidByCid(@Param("cid") Integer cid);

    List<ArticleInfoVO> showAuthorArticle(@Param("id") Integer id);

    Integer collectInfo(@Param("uid") Integer uid, @Param("bid") Integer bid);

    Integer collect(@Param("uid") Integer uid, @Param("bid") Integer bid);

    Integer addCollectionCount(@Param("bid") Integer bid);

    Integer uncollect(@Param("uid") Integer uid, @Param("bid") Integer bid);

    Integer delCollectionCount(@Param("bid") Integer bid);

    List<ArticleInfoVO> showBlogsByCollection(@Param("uid") Integer uid);

    Integer getLikeNum(@Param("uid") Integer uid, @Param("id") Integer id);

    void log(@Param("username") String username, @Param("desc") String desc);
}
